﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lola.DTO.Grilla;

namespace Lola.Datos.Persistencia
{
    /// <summary>
    /// 
    /// </summary>
    public static class pInformeSector
    {
        public static List<dtoSectorMicro> getMicrosEnSectorDTO(String galpon, String sector)
        {
            List<dtoSectorMicro> lista = new List<dtoSectorMicro>();

            using (SeminarioIEntities contexto = new SeminarioIEntities())
            {
                // obtengo los informes de sector 
                var query = from ise in contexto.InformeSectors
                            where ise.SectorGalpon.Galpon.nomGal.Equals(galpon) 
                            & ise.SectorGalpon.Sector.nomSec.Equals(sector)
                            & ise.fechaEntrada.HasValue
                            & !ise.fechaSalida.HasValue
                            select ise;

                foreach (InformeSector isctr in query)
                {
                    dtoSectorMicro smd = new dtoSectorMicro();
                    smd.CodigoServicio = isctr.Servicio.cod;
                    smd.FechaSalidaServicio = isctr.Servicio.fechaSalidaSer.ToString(); 
                    smd.FechaEntrada = isctr.fechaEntrada.ToString();
                    smd.FechaEntradaPrevista = isctr.fechaPrevistaEntrada.ToString();
                    smd.FechaSalida = isctr.fechaSalida.ToString();
                    smd.FechaSalidaPrevista = isctr.fechaPrevistaSalida.ToString();
                    smd.Interno = isctr.Servicio.numInt;

                    lista.Add(smd);
                }
            }

            return lista;
        }

        public static void RegistrarIngresoGalpon(String galpon, String sector, String codigoServicio) {

            using (SeminarioIEntities contexto = new SeminarioIEntities())
            {
                var query = from sg in contexto.SectorGalpons
                            where sg.Galpon.nomGal.Equals(galpon) & sg.Sector.nomSec.Equals("Porteria")
                            select sg;
                SectorGalpon sectorGalpon = query.First();

                query = from sg in contexto.SectorGalpons
                        where sg.Galpon.nomGal.Equals(galpon) & sg.Sector.nomSec.Equals("Taller")
                        select sg;
                SectorGalpon sectorGalponT = query.First();

                query = from sg in contexto.SectorGalpons
                        where sg.Galpon.nomGal.Equals(galpon) & sg.Sector.nomSec.Equals("Limpieza")
                        select sg;
                SectorGalpon sectorGalponL = query.First();

                query = from sg in contexto.SectorGalpons
                        where sg.Galpon.nomGal.Equals(galpon) & sg.Sector.nomSec.Equals("Suministros")
                        select sg;
                SectorGalpon sectorGalponS = query.First();

                var query2 = from infsec in contexto.InformeSectors orderby infsec.id descending select infsec;
                InformeSector ultimo = null;
                int ultimoId = -1;
                if (query2.Count() > 0)
                {
                    ultimo = query2.First();    
                    ultimoId = ultimo.id + 1;
                }
                else
                {
                    ultimoId = 1;
                }
                
                // El registro del servicio asociado al ingreso para el calculo de las horas previstas...
                var queryServicio = from s in contexto.Servicios where codigoServicio.Equals(s.cod) select s;
                Servicio elServicio = queryServicio.First();

                // El registro para porteria y galpon
                InformeSector isec = new InformeSector();
                
                isec.cod = codigoServicio;
                isec.fechaEntrada = DateTime.Now;
                isec.numSec = sectorGalpon.idConv;
                isec.id = ultimoId;
                isec.fechaPrevistaSalida = elServicio.fechaSalidaSer.AddMinutes(-30);

                contexto.AddToInformeSectors(isec);

                // El registro para taller
                InformeSector isecT = new InformeSector();

                isecT.cod = codigoServicio;
                isecT.numSec = sectorGalponT.idConv;
                isecT.id = ultimoId + 1;
                isecT.fechaPrevistaEntrada = DateTime.Now.AddMinutes(10);
                isecT.fechaPrevistaEntrada = elServicio.fechaSalidaSer.AddMinutes(-180);
                isecT.fechaPrevistaSalida = elServicio.fechaSalidaSer.AddMinutes(-150);

                contexto.AddToInformeSectors(isecT);

                // El registro para Limpieza
                InformeSector isecL = new InformeSector();

                isecL.cod = codigoServicio;
                isecL.numSec = sectorGalponL.idConv;
                isecL.id = ultimoId + 2;
                isecL.fechaPrevistaEntrada = elServicio.fechaSalidaSer.AddMinutes(-140);
                isecL.fechaPrevistaSalida = elServicio.fechaSalidaSer.AddMinutes(-110);

                contexto.AddToInformeSectors(isecL);

                // El registro para Suministros
                InformeSector isecS = new InformeSector();

                isecS.cod = codigoServicio;
                isecS.numSec = sectorGalponS.idConv;
                isecS.id = ultimoId + 3;
                
                isecS.fechaPrevistaEntrada = elServicio.fechaSalidaSer.AddMinutes(-100);
                isecS.fechaPrevistaSalida = elServicio.fechaSalidaSer.AddMinutes(-70);

                contexto.AddToInformeSectors(isecS);
                contexto.SaveChanges();
                
                
            }

        }

        public static void RegistrarIngresoASector(String galpon, String sector, String codigoServicio)
        {
            using (SeminarioIEntities contexto = new SeminarioIEntities())
            {
                var query = from p in contexto.InformeSectors
                            where
                                p.SectorGalpon.Sector.nomSec.Equals(sector)
                                & p.SectorGalpon.Galpon.nomGal.Equals(galpon)
                                & p.Servicio.cod.Equals(codigoServicio)
                            select p;
                InformeSector isec = query.First();

                isec.fechaEntrada = DateTime.Now;
                
                contexto.SaveChanges();
            }
        }

        public static void RegistrarSalidadeSector(String galpon, String sector, String codigoServicio)
        {
            using (SeminarioIEntities contexto = new SeminarioIEntities())
            {
                var query = from p in contexto.InformeSectors
                            where
                                p.SectorGalpon.Sector.nomSec.Equals(sector)
                                & p.SectorGalpon.Galpon.nomGal.Equals(galpon)
                                & p.Servicio.cod.Equals(codigoServicio)
                            select p;
                InformeSector isec = query.First();

                isec.fechaSalida = DateTime.Now;

                contexto.SaveChanges();
            }
        }

    }
}
